續前一篇文章,本篇稍微試了一下處理request的Json,但之後並不會使用本篇的方法,如果對Java處理Json資料很熟悉的朋友可以跳過本篇。
API Gateway for JAVA對於Json request/response的處理是使用Jackson,這在建立好的Project中Maven Dependencies當中就看的出來已經包含在裡面了,但我們先來試著讀取request當中的json看看吧。
當然你也可以使用自己習慣的Json Library,不過之後都以Jackson做為示範。
我希望從request.body當中取得name的value,反正已經先看過完整的request內容,就偷懶一下直接用找到field name去找吧
JsonNode node = new ObjectMapper().valueToTree(input).get("body");
String name = "John Doe";
if (node.has("name"))
name = node.get("name").asText();
response原本的匿名物件,也偷懶一下改一改
return new Object() {
public int statusCode = 200;
public String body;
public Object withBody(String body) {
this.body = body;
return this;
}
}.withBody("{\"message\":\"Hello " + name + " from Lambda!\"}");
然後發出包含{"name": "Spencer Liu"}的request..
唉..等等,沒有找到怎麼看到的是Jhon Doe,沒有抓到name嗎?
我們把body的內容輸出看看
"{\"name\": \"Spencer Liu\"}"
原來整個body的內容被加上脫逸符號並用雙引號包起來的... 沒錯,首尾的兩個雙引號不是我要表示字串才打上去的,而是字串內容就包含頭尾的雙引號...
所以很麻煩的,只好把body內容做一點處理後重新轉成Jason
以下是調整後完整的handler
@Override
public Object handleRequest(Object input, Context context) {
context.getLogger().log("Input: " + input + "\n");
// TODO: implement your handler
ObjectMapper mapper = new ObjectMApper();
JsonNode node = mapper.valueToTree(input);
String body = node.get("body").toString();
body = body.replace("\\", "").substring(1, body.length() - 1);
context.getLogger().log(body + "\n");
try {
node = mapper.readTree(body);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String name = "John Doe";
if (node.has("name"))
name = node.get("name").asText();
context.getLogger().log("name: " + name + "\n");
return new Object() {
public int statusCode = 200;
public String body;
public Object withBody(String body) {
this.body = body;
return this;
}
}.withBody("{\"message\":\"Hello " + name + " from Lambda!\"}");
}
這時候再重新送出request,終於正確得到
因為是比較隨意的測試,尤其其中對字串處理的方式有不少缺陷,這也是最開始看同事測試時有遇到的狀況。實際上,之後要講的是另一種做法,也是AWS文件上有示範的用POJO來處理request/response的方法,對於再Java上設計跟撰寫都比較容易處理也比較漂亮? ,也會有比較詳細示範的部分。